package haltica.com.mx.ape.web;

import flexjson.JSONSerializer;
import haltica.com.mx.ape.domain.PerfilRole;
import haltica.com.mx.ape.domain.UsuarioSistema;

import javax.persistence.Transient;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.roo.addon.web.mvc.controller.RooWebScaffold;
import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@RooWebScaffold(path = "usuariosistemas", formBackingObject = UsuarioSistema.class)
@RequestMapping("/usuariosistemas")
@Controller
public class UsuarioSistemaController {
	
	
	/**
	 * 
	 */
	@Autowired
	@Transient
	transient private MessageDigestPasswordEncoder passwordEncoder;
	
	/**
	 * 
	 */
	protected static final GrantedAuthority ROLE_ADMIN = new GrantedAuthorityImpl("ROLE_ADMIN");
	protected static final GrantedAuthority ROLE_CLIENTE = new GrantedAuthorityImpl("ROLE_CLIENTE");
	protected static final GrantedAuthority ROLE_WEB_CLIENTE = new GrantedAuthorityImpl("ROLE_WEB_CLIENTE");
	
	
	
	/**
	 * 
	 * @param newUsuario
	 * @return
	 */
	@RequestMapping(value = "/addUsuarioWebCliente", method = RequestMethod.POST)
	public ResponseEntity<String> addUsuarioWebClient(UsuarioSistema newUsuario) {
		PerfilRole perfil = PerfilRole.findRole(UsuarioSistemaController.ROLE_WEB_CLIENTE.getAuthority());
		return createAndValidUser(newUsuario, perfil, null, newUsuario.getIdSucursal());
	}
	
	
	/**
	 * 
	 * @param newUsuario
	 * @return
	 */
	@RequestMapping(value = "/addUsuarioAdmin", method = RequestMethod.POST)
	public ResponseEntity<String> addUsuarioAdmin(UsuarioSistema newUsuario) {
		
		PerfilRole perfil = PerfilRole.findRole(UsuarioSistemaController.ROLE_ADMIN.getAuthority());
		return createAndValidUser(newUsuario, perfil, null, null);
	}
	
	/**
	 * 
	 * @param newUsuario
	 * @return
	 */
	@RequestMapping(value = "/addUsuarioCliente", method = RequestMethod.POST)
	public ResponseEntity<String> addUsuarioCliente(UsuarioSistema newUsuario) {
		
		PerfilRole perfil = PerfilRole.findRole(UsuarioSistemaController.ROLE_CLIENTE.getAuthority());
		return createAndValidUser(newUsuario, perfil, newUsuario.getIdCliente(), null);
	}
	
	/**
	 * 
	 * @param newUsuario
	 * @param perfil
	 * @param idCliente
	 * @param idSucursal
	 * @return
	 */
	private ResponseEntity<String> createAndValidUser(
			UsuarioSistema newUsuario, PerfilRole perfil, Integer idCliente,
			Integer idSucursal) {
		
		HttpHeaders headers;
		String json;
		GenericResponse gRes;
		ResponseEntity<String> response;
		
		headers = new HttpHeaders();
		headers.set("Content-Type", "application/json");
		headers.add("Content-Type", "application/text; charset=utf-8");
		
		if (UsuarioSistema.existUsuarioUserName(newUsuario.getUsername())) {
			gRes = new GenericResponse(Boolean.FALSE, null, "El Usuario ya existe, favor de intentar con otro diferente");
			json = new JSONSerializer().exclude("*.class").serialize(gRes);
			
			response = new ResponseEntity<String>(json, headers, HttpStatus.OK);
			return response;
		}
		
		newUsuario.setPerfilRole(perfil);
		newUsuario.setEnabled(new Boolean(true));
		newUsuario.setIdCliente(idCliente);
		newUsuario.setIdSucursal(idSucursal);
		newUsuario.setPassword(passwordEncoder.encodePassword(newUsuario.getPassword(), null));
		
		newUsuario.persist();
		
		gRes = new GenericResponse(Boolean.TRUE, newUsuario);
		json = new JSONSerializer().exclude("*.class").serialize(gRes);
		
		response = new ResponseEntity<String>(json, headers, HttpStatus.OK);
		
		return response;
	}
	
	/**
	 * 
	 * @param uiModel
	 * @return
	 */
	@RequestMapping(value = "/createUserCliente", method = RequestMethod.GET)
    public String createUserClienteForm(Model uiModel) {
        uiModel.addAttribute("usuarioSistema", new UsuarioSistema());
        return "usuariosistemas/createUsuarioCliente";
    }
	
	/**
	 * 
	 * @param uiModel
	 * @return
	 */
	@RequestMapping(value = "/createUserWebCliente", method = RequestMethod.GET)
	public String createUserWebClienteForm(Model uiModel) {
        uiModel.addAttribute("usuarioSistema", new UsuarioSistema());
        return "usuariosistemas/createUsuarioWebCliente";
    }
	
	
}
